package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	//1、统计字符串的长度，按字节 len(str)
	//因为golang使用utf-8编码，所以中文占三个字节
	str := "hello北京"
	length := len(str)
	fmt.Println("str length = ", length)

	//2、字符串遍历，同时处理有中文的问题 r := []rune(str)
	str2 := "hello河南"
	str3 := []rune(str2)
	fmt.Println("转换成rune后的字符串长度=", len(str3))
	for i := 0; i < len(str3); i++ {
		fmt.Printf("字符=%c\n", str3[i])
	}

	//3、字符串转整数:	n, err := strconv.Atoi("12")
	n, err := strconv.Atoi("hello")
	if err != nil {
		fmt.Println("转换失败", err)
	} else {
		fmt.Println("转换成功", n)
	}

	//4、整数转字符串	str = strconv.Itoa(12345)
	m := strconv.Itoa(123)
	fmt.Println(m)

	//5、字符串 转 []byte:	var bytes = []byte("hello go")
	var bytes = []byte("hello go")
	fmt.Printf("bytes=%v\n", bytes)

	//6、[]byte 转 字符串: str = string([]byte{97, 98, 99})
	str4 := string([]byte{97, 98, 99})
	fmt.Println(str4)

	//7、10 进制转 2, 8, 16 进制:	str = strconv.FormatInt(123, 2) // 2-> 8 , 16
	formatInt := strconv.FormatInt(123, 2)
	fmt.Println("123的二进制", formatInt)

	//8、查找子串是否在指定的字符串中: strings.Contains("seafood", "foo") //true
	str8 := strings.Contains("马军测试go", "大黄")
	fmt.Println(str8)

	//9、统计一个字符串有几个指定的子串 ： strings.Count("ceheese", "e") //4
	str9 := strings.Count("majunmajisdf", "ma")
	fmt.Println(str9)

	//10、不区分大小写的字符串比较(== 是区分字母大小写的): fmt.Println(strings.EqualFold("abc", "Abc")) // true
	fold := strings.EqualFold("abc", "ABC")
	fmt.Println(fold)           //true
	fmt.Println("abc" == "ABC") //false

	//11、返回子串在字符串第一次出现的 index 值，如果没有返回-1 : strings.Index("NLT_abc", "abc") // 4
	index := strings.Index("nafsf_qbc", "qbc")
	fmt.Println("index", index)

	//12、返回子串在字符串最后一次出现的 index，如没有返回-1 : strings.LastIndex("go golang", "go")
	lastIndex := strings.LastIndex("sadfsdfwqerwe", "w")
	fmt.Println("最后出现的下标", lastIndex)

	//13、将指定的子串替换成 另外一个子串: strings.Replace("go go hello", "go", "go 语言", n)
	//    n 可以指定你希望替换几个，如果 n=-1 表示全部替换 strings.Split("hello,wrold,ok", ",")
	str13 := "Learn go ,lets go"
	replace := strings.Replace(str13, "go", "出发", 1)
	//原来的串并不会发生改变
	fmt.Println("替换后：", replace)
	fmt.Println("替换后原来的串：", str13)

	//14)按照指定的某个字符,为分割标识，将一个字符串拆分成字符串数组 ：strings.Split("hello,wrold,ok", ",")
	split := strings.Split("hello,world,nihao,haha", ",")
	for i := 0; i < len(split); i++ {
		fmt.Println("str[", i, "]=", split[i])
	}
	fmt.Println(split)

	//15、将字符串的字母进行大小写的转换: strings.ToLower("Go") // go strings.ToUpper("Go") // GO
	lower := strings.ToLower("aBc")
	fmt.Println("abc转为小写后", lower)
	fmt.Println("aBc转为大写后=", strings.ToUpper("aBc"))

	//16、将字符串左右两边的空格去掉： strings.TrimSpace(" tn a lone gopher ntrn	")
	space := strings.TrimSpace("  sdfsdf sfs  sfsdf   ")
	//%q:将结果加上""
	fmt.Printf("去左右两边空格后=%q\n", space)

	//17、将字符串左右两边指定的字符去掉 ： strings.Trim("! hello! ", " !")	// ["hello"] //将左右两边 ! 和 " "去掉
	trim := strings.Trim("! hello! ", " !")
	fmt.Println("去掉指定字符后=", trim)

	//18、将字符串左边指定的字符去掉 ： strings.TrimLeft("! hello! ", " !")	// ["hello"] //将左边 ! 和 " "去掉
	left := strings.TrimLeft("! hello! ", " !")
	fmt.Println("去掉左边指定字符后=", left)

	//19、将字符串右边指定的字符去掉 ： strings.TrimRight("! hello! ", " !")	// ["hello"] //将右边 ! 和 " "去掉
	right := strings.TrimRight("! hello! ", " !")
	fmt.Println("去掉右边指定字符后=", right)

	//20、判断字符串是否以指定的字符串开头: strings.HasPrefix("ftp://192.168.10.1", "ftp") // true
	prefix := strings.HasPrefix("http://118.23.34.5", "http")
	fmt.Println(prefix)

	//21、判断字符串是否以指定的字符串结束: strings.HasSuffix("NLT_abc.jpg", "abc") //false
	suffix := strings.HasSuffix("http://118.23.34.5", "5")
	fmt.Println(suffix)
}
